#ifndef _BSP_GPIO_H_
#define _BSP_GPIO_H_

#include "debug.h"

typedef struct {
    GPIO_TypeDef*               port;
    uint16_t                    GPIO_Pin;
    GPIOSpeed_TypeDef           GPIO_Speed;
    GPIOMode_TypeDef            GPIO_Mode;
    uint32_t                    RCC_APBxPeriph;
    void (*RCC_APBxPeriphClockCmd)(uint32_t RCC_APBxPeriph, FunctionalState NewState);
}BSP_GPIO_Typedef_t;

typedef enum {
    SET_HIGHT_LEVLE = 1,
    SET_LOW_LEVLE = !SET_HIGHT_LEVLE
} GPIO_Action_Typedef_t;

class BSP_GPIO {
private:
    BSP_GPIO_Typedef_t*     dev;
    void init(BSP_GPIO_Typedef_t* dev);
public:
    BSP_GPIO(BSP_GPIO_Typedef_t* dev);
    ~BSP_GPIO();
    bool GPIO_Control(GPIO_Action_Typedef_t action);
    FlagStatus GPIO_Status_Out();
    FlagStatus GPIO_Status_In();
    void GPIO_ModeChange(GPIOMode_TypeDef Mode);
};

#endif
